/*
*********************************************************************************************************
*
* 模块名称 :    bsp中间件层
* 文件名称 :    cicular_fifo.c
* 版    本 :    V1.0
* 说    明 :    抽象数据结构，循环队列类
*
* 修改记录 :
*   版本号  日期      作者      说明
*   V1.0    2025-2-18 miaozi    正式发布
*
*
*
*********************************************************************************************************
*/

#include "bsp_middleware.h"

/*********************************** 浮点型32位 ***********************************/
// 初始化环形缓冲区
void FIFO_F32_Init(CircularFifo_F32_T *buffer)
{
  buffer->head = 0;
  buffer->tail = 0;
  buffer->data_cnt=0;
  memset(buffer->data, 0, buffer->buf_cnt);
}

// 向环形缓冲区写入数据
uint8_t FIFO_F32_Write(CircularFifo_F32_T *buffer, float32_t data)
{
  uint16_t next = (buffer->head + 1) % (buffer->buf_cnt);
//  if (next == buffer->tail) {   //  缓冲区满
//      return 0;             //  写入失败
//  }
  __disable_irq();                    //  原子保护
  buffer->data[buffer->head] = data;  //  存储数据
  buffer->head = next;                //  更新写指针
  buffer->data_cnt++;
  if(buffer->data_cnt > buffer->buf_cnt)
  {
    buffer->data_cnt  =buffer->buf_cnt;
  }
  __enable_irq();                     //  原子保护

  return 1;  // 写入成功
}

//  FIFO速写
uint8_t FIFO_F32_FastWrite(CircularFifo_F32_T *buffer, float32_t data)
{
  __disable_irq();                    //  原子保护
  buffer->data[buffer->head] = data;  //  存储数据
  buffer->head++;                //  更新写指针
  __enable_irq();                     //  原子保护

  return 1;  // 写入成功
}

// 从环形缓冲区读取数据
uint8_t FIFO_F32_Read(CircularFifo_F32_T *buffer, float32_t *data)
{
  if (buffer->head == buffer->tail) {  //  缓冲区空
      return 0;                    //  读取失败
  }
  __disable_irq();                      //  原子保护
  *data = buffer->data[buffer->tail];   //  获取数据
  buffer->tail = (buffer->tail + 1) % (buffer->buf_cnt);  //  更新读指针
  buffer->data_cnt--;
  __enable_irq();                       //  原子保护

  return 1;  // 读取成功
}

// 判断环形缓冲区是否为空
uint8_t FIFO_F32_IsEmpty(CircularFifo_F32_T *buffer)
{
  return buffer->head == buffer->tail;
}

// 判断环形缓冲区是否已满
uint8_t FIFO_F32_IsFull(CircularFifo_F32_T *buffer)
{
  return ((buffer->head + 1) % (buffer->buf_cnt)) == buffer->tail;
}

// 判断判断尾部与头部之间的差距
uint8_t FIFO_F32_LengthGet(CircularFifo_F32_T *buffer)
{
  return (buffer->tail - buffer->head + buffer->buf_cnt) % buffer->buf_cnt;
}

/***********************************浮点型32位 ***********************************/

/***************************** LinkJoin(END OF FILE) *********************************/
